import { use_test_store } from '@/store/test'
import { getNameList, getDict } from '@/api/common'
import { ElMessage } from 'element-plus'

export let loadingFullSreen = {
  open: () => {
    document.getElementById('loading-next').style.display = 'block'
  },
  close: () => {
    document.getElementById('loading-next').style.display = 'none'
  },
}

// 随机字符串
export function randomString(len) {
  len = len || 10
  var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz' /** **默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
  var maxPos = $chars.length
  var pwd = ''
  for (let i = 0; i < len; i++) {
    pwd += $chars.charAt(Math.floor(Math.random() * maxPos))
  }
  return pwd
}

// 加载脚本
export function loadScript(url, callback = function () {}) {
  const script = document.createElement('script')
  script.onload = () => callback()
  script.src = url
  document.body.appendChild(script)
}

// 监听滚动条
export function watchScroll(el) {
  window.addEventListener('scroll', scrollToTop, true)
  el.addEventListener('click', handle)
  function handle() {
    window.scrollTo({
      top: 0,
      // behavior: 'smooth',
    })
  }
  function scrollToTop() {
    let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
    el.style.display = scrollTop > 120 ? 'block' : 'none'
  }
}

export function isValidDate(date) {
  return date instanceof Date && !isNaN(date.getTime())
}

// 时间格式化
export function getformatDate(dateStr, type = 'all') {
  if (!dateStr) return ''
  // 处理10位时间戳转化
  if (Number(dateStr) && String(dateStr).length == 10) {
    dateStr = dateStr * 1000
  }
  var time = new Date(dateStr)
  if (!isValidDate(time)) return
  const y = time.getFullYear() // 可返回一个表示年份的 4 位数字
  const m = time.getMonth() + 1 < 10 ? '0' + (time.getMonth() + 1) : time.getMonth() + 1 // 可返回表示月份的数字。返回值是 0（一月） 到 11（十二月） 之间的一个整数 // 注意： 一月为 0, 二月为 1, 以此类推。
  const d = time.getDate() < 10 ? '0' + time.getDate() : time.getDate()
  const h = time.getHours() < 10 ? '0' + time.getHours() : time.getHours()
  const min = time.getMinutes() < 10 ? '0' + time.getMinutes() : time.getMinutes()
  const seconds = time.getSeconds() < 10 ? '0' + time.getSeconds() : time.getSeconds()
  if (type === 'yyyy') {
    return y
  }
  if (type === 'mm') {
    return m
  }
  if (type === 'dd') {
    return d
  }
  if (type === 'yyyy-mm') {
    return y + '-' + m
  }
  if (type === 'yyyy/mm/dd') {
    return y + '/' + m + '/' + d
  }
  if (type === 'yyyy-mm-dd') {
    return y + '-' + m + '-' + d
  }
  if (type === 'all') {
    return y + '-' + m + '-' + d + ' ' + h + ':' + min + ':' + seconds
  }
}

// 文件处理队列
export function fileQueue(list) {
  return new Promise((resolve) => {
    const arr = list.map((_) => readerFile(_))
    Promise.all(arr).then((res) => resolve(res))
  })
}

// 读取文件
export function readerFile(_) {
  return new Promise((resolve) => {
    // 获取FileReader实例
    var reader = new FileReader()
    // 将文件加载进入
    reader.readAsDataURL(_.raw)
    reader.onload = function () {
      // 转换完成输出该文件base64编码
      var data = {
        fileTitle: _.name,
        fileContent: this.result.split(',')[1], // 去除 base64 头部
      }
      resolve(data)
    }
  })
}

// 图片前缀服务地址
export function getServerImg(url) {
  var reg = new RegExp('[\\u4E00-\\u9FFF]+', 'g')
  if (reg.test(url)) {
    return ' '
  }
  url = url || ''
  url = url.startsWith('/') ? url : `/${url}`
  let isDev = import.meta.env.MODE === 'development'
  let pre = isDev ? `https://xmjz.zefusoft.com` : ''
  return `${pre}${url}`
}

// 前往申报
export function toReport() {
  window.open('https://zjtx.miit.gov.cn/zxqySy/main', '_blank')
}

export function scrollTo() {
  window.scrollTo({
    top: 0,
    // behavior: 'smooth',
  })
}

// 获取base64
export function getBase64(file) {
  return new Promise(function (resolve, reject) {
    let reader = new FileReader()
    let imgResult = ''
    reader.readAsDataURL(file)
    reader.onload = function () {
      imgResult = reader.result
    }
    reader.onerror = function (error) {
      reject(error)
    }
    reader.onloadend = function () {
      resolve(imgResult)
    }
  })
}

/**
 * 根据后端返回的文件流转为excel导出
 * @param {Object} data
 */
export function exportExcelMethod(data, download) {
  const link = document.createElement('a')
  const blob = new Blob([data], {
    type: 'application/vnd.ms-excel',
  })
  link.style.display = 'none'
  link.href = URL.createObjectURL(blob)
  link.download = download // 下载的文件名
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
}

export function getAnonymityUuid() {
  let key = 'anonymityUuid'
  let id = localStorage.getItem(key)
  if (!id) {
    localStorage.setItem(key, randomString())
  }
  return localStorage.getItem(key)
}

export function setAnonymityUuid(val = '') {
  let key = 'anonymityUuid'
  localStorage.setItem(key, val)
}

export function clearTestData() {
  let test = use_test_store()
  test.resetTest()
}

// 清空数组中的空值
export function clear_arr_trim(array) {
  for (var i = 0; i < array.length; i++) {
    if (array[i] == '' || array[i] == null || array[i] == 'null' || array[i] == 'undefined' || typeof array[i] == 'undefined') {
      array.splice(i, 1)
      i = i - 1
    }
  }
  return array
}

// 是否是空
export function isUndefined(target) {
  if (!target || target == '' || target == 'null' || target == 'undefined' || target == null || typeof target == 'undefined') {
    return ''
  } else {
    return target
  }
}

// 千分位处理
export function thousands(num) {
  if (!num) return 0
  return Number(num).toLocaleString()
}
//图表取整
export function ceil(number) {
  let bite = 0
  if (number < 10) {
    return 10
  }
  while (number >= 10) {
    number /= 10
    bite += 1
  }
  return Math.ceil(number) * Math.pow(10, bite)
}

// tree 扁平化
export function convertToFlat(treeData = [], key = 'children') {
  treeData = JSON.parse(JSON.stringify(treeData))
  let flatData = []
  for (let i = 0; i < treeData.length; i++) {
    flatData.push({ ...treeData[i] })
    if (treeData[i][key]) {
      flatData.push(...convertToFlat(treeData[i][key]))
      delete treeData[i][key]
    }
  }
  return flatData
}

// 获取英文型号简写
export function getEnModel(cn) {
  let map = {
    大型: 'L',
    中型: 'M',
    小型: 'S',
    微型: 'XS',
  }
  return map[cn]
}
export function getChModel(sc) {
  let map = {
    L: ' 大型',
    M: '中型',
    S: '小型',
    XS: '微型',
  }
  return map[sc]
}

// isGetNameList 是否是走 旧领域接口
export function getDomainList(businessType, isGetNameList) {
  if (isGetNameList) {
    // 1 行业专家、2 科研机构、3 产研成果、4 企业、5 产业园区、6 中试服务、7 需求、8 项目、9 政策
    return getNameList({ businessType })
  } else {
    return getDict({ pcode: 'DOMAIN_CLASSIFY', type: 2 }).then((res) => {
      return { data: res?.data?.map((_) => _.name) || [] }
    })
  }
}

export function toEn() {
  let origin = window.location.origin
  if (origin.includes('127')) {
    origin = 'https://xmjz.zefusoft.com'
  }
  window.open(`${origin}/en`, 'xmjz-en')
}

export function toSystem() {
  let origin = window.location.origin
  if (origin.includes('127')) {
    origin = 'https://xmjz.zefusoft.com'
  }
  window.open(`${origin}/system`, 'xmjz-en')
}
// needMessage 是否提示
export function windowOpen(url, needMessage = true) {
  if (checkUrl(url)) {
    window.open(url)
  }
  function checkUrl(urlString) {
    if (!urlString) {
      needMessage && ElMessage.warning('跳转路径为空')
      return
    }
    var reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/
    if (reg.test(urlString)) {
      return true
    } else {
      needMessage && ElMessage.warning('跳转路径不是一个正确的网址')
      return
    }
  }
}
export function isUrl(url) {
  if (url != '') {
    var reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/
    return reg.test(url)
  }
}

// 姓名 脱敏处理
export function encryptedName(str) {
  if (!str) return
  return str.substring(0, 1) + '**'
}

// 手机号 脱敏处理
export function encryptedTel(str) {
  if (!str) return
  return str.substr(0, 3) + '****' + str.substring(7)
}

// 获取科技成熟度说明
export function getEvaluateRankText() {
  return [
    '明确该技术有关的基本原理，形成报告',
    '基于科学原理提出实际应用设想，形成技术方案',
    '关键功能和特性在实验室条件下通过试验或仿真完成了原理性验证',
    '关键功能试样/模块在实验室通过了试验或仿真验证',
    '形成产品初样（部件级），在模拟使用环境中进行了试验或仿真验证',
    '形成产品正样（系统级），通过高逼真度的模拟使用环境中进行验证',
    '形成整机产品工程样机，在真实使用环境下通过试验验证',
    '实际产品设计定型，通过功能、性能测试，可进行产品小批量生产',
    '系统产品批量生产，功能、性能、质量等特性在实际任务中得到充分验证 ',
  ]
}

/**
 * 返回枚举中 对应的 label 或者 value
 * @param  n 需要转化的 label 或者 value 名
 * @param  arr 枚举
 * @param  label
 * @param  value
 */
export function getLabelOrValue(n, arr, label = 'name', value = 'code') {
  // 如果不能转为数字的处理
  if (isNaN(Number(n))) {
    for (var i = 0; i < arr.length; i++) {
      let item = arr[i]
      if (n == item[label]) {
        return item[value]
      }
    }
  }
  // 能转为数字的处理
  else {
    for (var i = 0; i < arr.length; i++) {
      let item = arr[i]
      if (n == item[value] && item.value !== '') {
        return item[label]
      }
    }
  }
}

// 字符串转时间戳
export function strToTimeStamp(str) {
  if (!str) return
  return new Date(str).getTime() / 1000
}

// 字典转化
export async function getIndustryName(code) {
  let res = await getDict({ pcode: 'GB_INDUSTRY_CATEGORY' })
  return res.data.find((_) => _.code == code)?.name
}

// 字典转化
export async function getIndustryName2(code) {
  let res = await getDict({ pcode: 'GB_INDUSTRY_CATEGORY' })
  return res.data.find((_) => _.code == code)?.name
}

export function pollingRun(fun, dalay = 500) {
  try {
    fun()
  } catch (error) {
    setTimeout(() => {
      pollingRun(fun)
    }, dalay)
  }
}

export function openUsign() {
  window.open('https://xmjz.zefusoft.com/xmjz-usign')
}
